package sifeap.pl.managedbean.convenios;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import sifeap.bl.ejb.convenios.ConvenioBLLocal;
import sifeap.bl.ejb.gestionarchivos.GestionArchivosBLLocal;
import sifeap.entities.convenios.Convenio;
import sifeap.entities.convenios.valueobject.ConvenioVO;
import sifeap.entities.gestionarchivos.valueobject.GestionArchivoVO;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.managedbean.usuarios.LoginManagedBean;
import sifeap.pl.util.FacesUtils;
import sifeap.util.ValidadorExpresiones;

@ManagedBean(name="conveniosManagedBean")
@SessionScoped
public class ConveniosManagedBean {
	private Long idConvenio;
	private String nombre;
	private String descripcion;
	private String direccion;
	private String telefono;
	private String nit;
	private String correo;
	
	private List<File> listaArchivos; //Se implementa como lista para futuras reutilizaciones
	
	private int accion;
	
	private List<Convenio> listaConvenios;
	
	private File archivoSeleccionado;
	
	private InputStream stream;
	
	private StreamedContent mostrarArchivo;
	
	private final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";
	
	@EJB
	private ConvenioBLLocal convenioBL;
	
	@EJB
	private GestionArchivosBLLocal gestionArchivosBL;
	
	@PostConstruct
	public void inicializar() {
		buscarTodos();
	}
	
	public Long getIdConvenio() {
		return idConvenio;
	}
	
	public void setIdConvenio(Long idConvenio) {
		this.idConvenio = idConvenio;
	}
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public String getDescripcion() {
		return descripcion;
	}
	
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	public String getDireccion() {
		return direccion;
	}
	
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	
	public String getTelefono() {
		return telefono;
	}
	
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	
	public String getNit() {
		return nit;
	}
	
	public void setNit(String nit) {
		this.nit = nit;
	}
	
	public String getCorreo() {
		return correo;
	}
	
	public void setCorreo(String correo) {
		this.correo = correo;
	}
	
	public int getAccion() {
		return accion;
	}

	public void setAccion(int accion) {
		this.accion = accion;
	}

	public List<Convenio> getListaConvenios() {
		return listaConvenios;
	}

	public void setListaConvenios(List<Convenio> listaConvenios) {
		this.listaConvenios = listaConvenios;
	}
	
	public Boolean getMostrarResultados() {
		if (listaConvenios != null && listaConvenios.size() > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	public File getArchivoSeleccionado() {
		return archivoSeleccionado;
	}
	public void setArchivoSeleccionado(File archivoSeleccionado) {
		this.archivoSeleccionado = archivoSeleccionado;
	}
	
	public List<File> getListaArchivos() {
		return listaArchivos;
	}
	
	public void setListaArchivos(List<File> listaArchivos) {
		this.listaArchivos = listaArchivos;
	}
	
	public void setMostrarArchivo(StreamedContent mostrarArchivo) {
		this.mostrarArchivo = mostrarArchivo;
	}
	
	public boolean isArchivoCargado() {
		if (listaArchivos != null && listaArchivos.size() > 0) {
			return true;
		} else {
			return false;
		}
	}

	public void guardar() {
		try {
			//Valida los obligatorios
			if (!validarObligatorios()) {
				return;
			}
			
			//Arma la entidad
			Convenio convenio;
			
			if (getAccion() == ConvenioVO.ACCION_MODIFICAR) {
				convenio = convenioBL.buscar(getIdConvenio());
			} else {
				convenio = new Convenio();
			}
			convenio.setNombre(getNombre());
			convenio.setDescripcion(getDescripcion() != null && !getDescripcion().trim().equals("") ? getDescripcion() : null);
			convenio.setDireccion(getDireccion() != null && !getDireccion().trim().equals("") ? getDireccion() : null);
			convenio.setTelefono(getTelefono());
			convenio.setNit(getNit() != null && !getNit().trim().equals("") ? getNit() : null);
			convenio.setCorreo(getCorreo());
			
			//Solo es un archivo
			if (getListaArchivos() != null && getListaArchivos().size() > 0) {
				convenio.setImagen(getListaArchivos().get(0).getName());
			} else {
				if (getAccion() == ConvenioVO.ACCION_MODIFICAR) {
					//Si no esta "Editar Convenio", elimina el archivo fisicamente.
					convenio.setImagen(null);
					try {
						//Intenta eliminar el archivo cuando se guarda la modificacion
						if (getArchivoSeleccionado() !=  null) {
							gestionArchivosBL.eliminarArchivo(getArchivoSeleccionado().getName(), GestionArchivoVO.PARAMETRO_UBICACION_CONVENIOS);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			
			//Obtiene el usuario de la sesion
			UsuarioVO usuario = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
			convenio.setUsuario(usuario.getUsuario());
			
			boolean resultado;
			
			if (getAccion() == ConvenioVO.ACCION_MODIFICAR) {
				resultado = convenioBL.modificar(convenio);
			} else {
				resultado = convenioBL.crear(convenio);
			}
			
			if (resultado) {
				buscarTodos();
				
				if (getAccion() == ConvenioVO.ACCION_MODIFICAR) {
					FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.modificar.exito"), false);
				} else {
					FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.crear.exito"), false);
				}
				
				limpiarCampos();
			}
		} catch (Exception e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.crear.error"), false);
			} catch (SifeapException e1) {}
			e.printStackTrace();
		}
	}
	
	public String limpiar() {
		limpiarCampos();
		return "/web/convenios/convenios.jsf?faces-redirect=true";
	}
	
	public String cancelar() {
		if(getAccion() == ConvenioVO.ACCION_MODIFICAR) {
			limpiarCampos();
		} else {
			setAccion(ConvenioVO.ACCION_CREAR);
			setIdConvenio(null);
		}
		return "/web/convenios/convenios.jsf?faces-redirect=true";
	}
	
	private void limpiarCampos() {
		setAccion(ConvenioVO.ACCION_CREAR);
		setNombre(null);
		setDescripcion(null);
		setDireccion(null);
		setTelefono(null);
		setNit(null);
		setCorreo(null);
		setListaArchivos(null);
		setArchivoSeleccionado(null);
		
		try {
			if (stream != null) {
				stream.close();
			}
		} catch (Exception e) {}
		
		mostrarArchivo = null;
	}
	
	private boolean validarObligatorios() {
		boolean resultado = true;
		
		//Valida el documento
		if (!(getNombre() != null && getNombre().trim().length() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.nombre.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if (!(getTelefono() != null && getTelefono().trim().length() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.telefono.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if (!(getCorreo() != null && getCorreo().trim().length() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.correo.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (!ValidadorExpresiones.validar(ValidadorExpresiones.EMAIL, getCorreo())) {
			//No es un correo valido!
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.correo.novalido"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return resultado;
	}
	
	public void cargarEditar() {
		String idConvenio = FacesUtils.getRequestParameter("p_idconvenio_edit");
		
		if (idConvenio != null) {
			setAccion(ConvenioVO.ACCION_MODIFICAR);
			
			try {
				setIdConvenio(new Long(idConvenio));
				
				Convenio convenio = convenioBL.buscar(getIdConvenio());
				
				setNombre(convenio.getNombre());
				setDescripcion(convenio.getDescripcion());
				setDireccion(convenio.getDireccion());
				setTelefono(convenio.getTelefono());
				setNit(convenio.getNit());
				setCorreo(convenio.getCorreo());
				
				listaArchivos = new ArrayList<File>();
				if (convenio.getImagen() != null && convenio.getImagen().trim().length() > 0) {
					//Tiene imagen...
					File archivo = new File(convenio.getImagen());
					listaArchivos.add(archivo);
				}
				
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (SifeapException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void cargarEliminar() {
		String idConvenio = FacesUtils.getRequestParameter("p_idconvenio_elim");
		if (idConvenio != null) {
			setIdConvenio(new Long(idConvenio));
		}
	}
	
	public void eliminar() {
		try {
			Convenio convenio = convenioBL.buscar(getIdConvenio());
			convenioBL.eliminar(convenio);
			
			try {
				//Intenta eliminar el archivo
				gestionArchivosBL.eliminarArchivo(convenio.getImagen(), GestionArchivoVO.PARAMETRO_UBICACION_CONVENIOS);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			buscarTodos();
			limpiarCampos();
			
			FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.eliminar.exito"), false);
		} catch (Exception e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.eliminar.error"), false);
			} catch (Exception ex) {}
		}
	}
	
	public String eliminarArchivo() {
		if (stream != null) {
			try {
				stream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		if (getArchivoSeleccionado() != null) {
			try {
				Boolean eliminado = null;
				if (getAccion() != ConvenioVO.ACCION_MODIFICAR) {
					//Si no esta "Editar Convenio", elimina el archivo fisicamente.
					eliminado = gestionArchivosBL.eliminarArchivo(getArchivoSeleccionado().getName(), GestionArchivoVO.PARAMETRO_UBICACION_CONVENIOS);
				}
				
				if (eliminado != null) {
					if (eliminado) {
						listaArchivos.remove(getArchivoSeleccionado());
					} else {
						FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.eliminararchivo.error1"), false);
					}
				} else {
					listaArchivos.remove(getArchivoSeleccionado());
				}
			} catch (Exception e) {
				try {
	        		FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.eliminararchivo.error2"), false);
				} catch (Exception e1) {}
				e.printStackTrace();
			}
		}
		return "";
	}
	
	public void subirArchivo(FileUploadEvent event) {
		UploadedFile archivoSubido = event.getFile();
		try {
			
			File archivo = new File(archivoSubido.getFileName());
			String nombreArchivo = archivo.getName(); //Normaliza el nombre de archivo
			
			archivo = gestionArchivosBL.guardarArchivo(nombreArchivo, archivoSubido.getInputstream(), GestionArchivoVO.PARAMETRO_UBICACION_CONVENIOS);
			
            if (listaArchivos == null) {
            	listaArchivos = new ArrayList<File>();
            }
            listaArchivos.add(archivo);
        } catch (Exception e) {
        	try {
        		FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.subirarchivo.error"), false);
			} catch (Exception e1) {}
        	
            e.printStackTrace();
        }
    }
	
	public StreamedContent getMostrarArchivo() {
		if (getArchivoSeleccionado() != null) {
			//InputStream stream;
			try {
				GestionArchivoVO gestionArchivoVo = gestionArchivosBL.obtenerArchivo(getArchivoSeleccionado().getName(), GestionArchivoVO.PARAMETRO_UBICACION_CONVENIOS);
				stream = gestionArchivoVo.getInputStream();
				
				mostrarArchivo = new DefaultStreamedContent(stream, gestionArchivoVo.getContentType(), gestionArchivoVo.getNombreArchivo());
			} catch (Exception e) {
				try {
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.convenios.mostrararchivo.error"), false);
				} catch (Exception e1) {}
				e.printStackTrace();
			}
		}
		return mostrarArchivo;
	}
	
	private void buscarTodos() {
		try {
			listaConvenios = convenioBL.buscarTodos();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Verifica si para el usuario autenticado tiene los permisos solicitados
	 * @return
	 */
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("admon_convenios:crear","admon_convenios:consultar");
	}
}